﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace ApiVersionControlDemo.Controllers
{
    [ApiController]
    public class TestController : ControllerBase
    {

        #region api/test 没有 ApiVersion 特性无法被请求到
        [HttpGet]
        [Route("api/test")]
        public string Test(string name)
        {
            return "Test V1.0-" + name;
        }
        #endregion

        #region api/Neutral 使用ApiVersionNeutral指定不需要版本控制的Api
        // 也可以使用 http://localhost:52622/api/Neutral?api-version=1.0 访问
        [ApiVersionNeutral]
        [HttpGet]
        [Route("api/neutral")]
        public string Neutral(string name)
        {
            return "Neutral V1.0-" + name;
        }
        #endregion

        #region api/get V1.0 QueryString中使用版本控制
        [ApiVersion("1.0")]
        [HttpGet]
        [Route("api/get")]
        public string GetV1(string name)
        {
            /*
             * 以下Url 请求到的是1.0版本的
             * 
             * http://localhost:52622/api/get?name=name
             * http://localhost:52622/api/get?api-version=1.0&name=name
             */
            return "Get V1.0-" + name;
        }
        #endregion

        #region api/get V2.0 QueryString中使用版本控制
        [ApiVersion("2.0", Deprecated = true)]// An 2020-02-01 [ Deprecated:是否是弃用状态,API还是可用，只是让用户意识到未来可能弃用 ]
        [Route("api/get")]
        [HttpGet]
        public string GetV2(string name)
        {
            /*
             * 以下Url 请求到的是2.0版本的
             * 
             * http://localhost:52622/api/get?api-version=2.0&name=name
             */
            return "Get V2.0-" + name;
        }
        #endregion

        #region api/value 用路由来指定请求Api的版本
        // http://localhost:52622/api/1.0/value  -》正确   等价方式：http://localhost:52622/api/1/value

        // http://localhost:52622/api/value     -》找不到网页
        [ApiVersion("1.0")]
        [HttpGet]
        [Route("api/{v:apiVersion}/value")]
        public string Value(string name)
        {
            return "Value V1.0-" + name;
        }

        // ===== 本人 推荐的Url格式如下，Url看起来更干净
        // http://localhost:52622/api/v1/tuijian
        [ApiVersion("1.0")]
        [HttpGet]
        [Route("api/v{v:apiVersion}/tuijian")]
        public string TuiJian(string name)
        {
            return "TuiJian V1.0-" + name;
        }


        #endregion

        #region 还有一种在 http 头中 带入版本号的方式；本人不推荐使用，故这里不做深入研究 请参照如下文章

        // https://www.cnblogs.com/lwqlun/p/9747180.html

        #endregion

    }
}
